.TITLE TTYH .IDENT /06.04/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; All rights reserved ; ; COPYRIGHT (c) 1983,1986,1987 BY DIGITAL EQUIPMENT CORPORATION. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 27-JAN-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHIN ; R. PHILPOTT ; S. ADAMS ; L. KOGAN ; ; MODIFICATIONS: ; ; ; L. KOGAN 02-NOV-85 06.01 ; LK703 -- DO NOT DISABLE REMOTE LINE WHEN DTR IS DROPPED ; ; L. KOGAN 18-JUN-86 6.02 ; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT ; ; TODD SCHOELLER 27-Nov-86 06.03 ; TMS047 -- SET TIMER TO EXPIRE IN THE UCB EXTENSION INDEXED ; OFF OF THE CORRECT R4. ; ; Modified for RSX-11M-PLUS V4.5 by: ; ; D. Carroll 15-Feb-1993 06.04 ; DC120 - Correct problem in ACD code for setting ; up R2 to be an index during STAX. ; ; ; ;+ ; CONTROLLER-DEPENDENT ROUTINES FOR DH-11. ;- ; ; .IF DF D$$H11 .MCALL UCBDF$ UCBDF$ ;DEFINE UCB SYMBOLS .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ ;DEFINE KRB SYMBOLS .IFF ;R$$MPL .MCALL SCBDF$ SCBDF$ ;DEFINE SCB SYMBOLS .ENDC ;R$$MPL .PSECT MAP5 ; ; ; EQUATED SYMBOLS ; ; DH-11 REGISTER DEFINITIONS ; SCR = 0 ;SYSTEM CONTROL REG. NRC = 2 ;NEXT RECEIVED CHAR. REG. LPR = 4 ;LINE PARAMETER REG. CAR = 6 ;CURRENT ADDRESS REG. BCR = 10 ;BYTE COUNT REG. BAR = 12 ;BUFFER ACTIVE REG. ; ; ;+ ; YHSTAX - START OUTPUT. ; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOP+2 BUFFER POINTER ; U.TOC BYTE COUNT ; ; OUTPUT: ; OUTPUT STARTED. ; U.TOP+2 UNCHANGED ; U.TOC UNCHANGED ; ; REGISTERS ALTERED: R4 ;- ; ; .ENABL LSB ; YHSTAX:: BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED? BEQ 5$ ;;;N - POSSIBLY BEGIN NORMAL PRIORITY OUTPUT BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? BEQ 60$ ;;;Y - DO HIGH PRIORITY OUTPUT AT NEXT INTERRUPT BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIORITY OUTPUT ;;;IN CASE A NORMAL PRIORITY REQUEST COMES ALONG STAXH: CALL SELLIN ;;;SELECT THE LINE BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF? BEQ 3$ ;;;N - JUMP BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION .IF DF T$$SPL MOV #YVXOFF-20000,CAR(R3) ;;;POINT TO DMA BUFFER .IFF ;T$$SPL MOV #YVXOFF,CAR(R3) ;;;POINT TO DMA BUFFER .IFTF ;T$$SPL BR 4$ ;;;JOIN COMMON CODE 3$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;NOT XOFF, MUST BE XON, RESET INDICATION .IFT ;T$$SPL MOV #YVXON-20000,CAR(R3) ;;;OUTPUT AN XON .IFF ;T$$SPL MOV #YVXON,CAR(R3) ;;;OUTPUT AN XON .ENDC ;T$$SPL 4$: MOV #-1,BCR(R3) ;;;SET TO OUTPUT ONE CHAR. BR YHRESX ;;;INITIATE THE OUTPUT REGARDLESS OF XOFF STATE 5$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUEST IN PROGRESS? BNE 60$ ;;;Y - DO NORMAL PRIORITY OUTPUT AT NEXT INTRPT. STAXN: ;;;REFERENCE LABEL .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC STAXM: MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MOUT ROUTINE CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER MOV (SP)+,R2 ;;;RESTORE R2 CALL SELLIN ;;;SELECT LINE MOV R5,CAR(R3) ;;;POINT TO DMA BUFFER ADD #U.ADMA-U.TSTA,CAR(R3) ;;; MOV #-1,BCR(R3) ;;;OUTPUT ONE CHARACTER BR 50$ ;;;INITIATE THE OUTPUT .ENDC ;T$$ACD 10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 CALL SELLIN ;;;SELECT LINE STAX1: .IF DF T$$SPL MOV (R4),CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2) CMP (R4)+,#120000 ;;;IN SYSTEM POOL? BLO 20$ ;;;Y - UMR MAPPING IS CORRECT, JUMP SUB #20000,CAR(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5 20$: ;;;REFERENCE LABEL .IFF ;T$$SPL .IF DF M$$EXT MOV (R4)+,CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2) .IFF ;M$$EXT MOV (R4)+,-(SP) ;;;GET VIRTUAL BUFFER ADDRESS CMP @SP,#120000 ;;;IN SYSTEM POOL? BLO 40$ ;;;Y - VIRTUAL ADDRESS = PHYS. ADDRESS, JUMP ADD RELC+2,@SP ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESS MOV RELC,-(SP) ;;; BCC 30$ ;;;NO CARRY - JUMP ADD #20,@SP ;;;ADD CARRY TO HIGH 2 BITS BIC #^C<60>,@SP ;;;NORMALIZE HIGH 2 BITS 30$: BISB (SP)+,@R3 ;;;LOAD 2 HIGH BITS OF 18-BIT ADDRESS 40$: MOV (SP)+,CAR(R3) ;;;LOAD CAR .ENDC ;M$$EXT .ENDC ;T$$SPL ASSUME U.TOC, MOV @R4,BCR(R3) ;;;SET BYTE COUNT (U.TOC) IN BCR NEG BCR(R3) ;;;NEGATE IT ASSUME S2.CTS,100000 50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 60$ ;;;IF SO, DON'T RESUME OUTPUT ; ; ;+ ; YHRESX - RESUME OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0 ;- ; ; YHRESX::BIS $BTMSK(R2),BAR(R3) ;;;SET BIT IN BAR TO START TRANSMISSION .IF NDF D$$M11 YHMTIM:: .ENDC ;D$$M11 60$: RETURN ;;; ; .DSABL LSB ; ; ;+ ; YHABOX - ABORT OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; ; REGISTERS ALTERED: R3 ;- ; ; YHABOX::CALL YHSTOX ;;;STOP TRANSMISSION CALL SELLIN ;;;SELECT LINE CLR BCR(R3) ;;;CLEAR BYTE COUNT CLR BCR(R3) ;;;DO IT AGAIN - CONTROLLER MAY HAVE BEEN ;;;DOING A READ-MODIFY-WRITE CYCLE ON ;;;THE BYTE COUNT REGISTER WHEN WE CLEARED ;;;IT FIRST TIME RETURN ;;; ; ; ;+ ; YHSTOX - STOP OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1 ;- ; ; YHSTOX::BIC $BTMSK(R2),BAR(R3) ;;;CLEAR BIT IN BAR TO STOP TRANSMISSION RETURN ;;; ; ; .ENABL LSB .IF DF T$$GMC!T$$SMC!D$$M11 ;+ ; YHLPAR - GET/SET LINE PARAMETERS. ; ; INPUT: ; R0 BIT 15: 0 = SET SPEED ; 1 = GET SPEED ; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC ; BIT 10: 1 = SET DEVICE DEPENDENT SPEED ; (USED FOR SETTING PARITY) ; BIT 9: 1 = GET/SET ANSWER SPEED ; BIT 8: 0 = GET/SET RECEIVE SPEED ; 1 = GET/SET TRANSMIT SPEED ; IF SET SPEED: ; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) ; ; R1 Flow control status change flags. ; ; BIT 0: 1 = Enable input flow control. ; BIT 1: 1 = Disable input flow control. ; BIT 2: 1 = Enable output flow control. ; BIT 3: 1 = Disable output flow control. ; ; BITS 4-15: Reserved ; ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; ; OUTPUT: ; IF GET SPEED REQUESTED: ; R4 POINTER TO DH11 SPEED TABLE ; CC-C 0 ; ; IF SET SPEED REQUESTED: ; CC-C 0 IF OK ; 1 IF ILLEGAL SPEED SPECIFIED ; ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSE ; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR ; AUTO-BAUD DETECT). ; ;- ; ; ; YHLPAR:: TST R1 ;Called for flow control change? BEQ 5$ ;If EQ no - go on. RETURN ;Not processed for DH. 5$: .IF DF T$$GMC ! T$$SMC BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN 7$: BIT #10000,R0 ;CHECK SET 7-BIT BEQ 8$ ;NO. SET SPEED-PARITY BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS 8$: .ENDC ;T$$GMC ! T$$SMC BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMP BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMP BIC #177400,R0 ;CLEAR UPPER BYTE MOVB SPDH-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS 10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS MOV R0,R2 ;GET A COPY .IF DF R$$EIS ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EIS CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS BIS R0,R2 ;ADD IN RECEIVE SPEED BITS MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE BR SETLN1 ;SET PARITY AND NEW SPEED IN CONTROLLER 20$: ;REFERENCE LABEL .IF DF T$$GMC&T$$SMC MOV R0,R4 ;SAVE INPUT PARAMETER SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP .ENDC .IF DF T$$GMC MOV #SPDH,R4 ;POINT TO DH11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0 .ENDC ;T$$GMC .IF DF T$$SMC!D$$M11 .IF NDF T$$GMC MOV R0,R4 ;SAVE INPUT PARAMETER SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC 30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTE MOVB SPDH-1(R0),R2 ;GET SPEED BITS SEC ;ASSUME ERROR BMI 40$ ;NOT A SUPPORTED SPEED - JUMP ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMP .IF DF D$$M11 BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUE BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED CLC ;SHOW SUCCESS .IFF ;D$$M11 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORT .ENDC ;D$$M11 40$: RETURN ; 50$: BCS 60$ ;TRANSMIT SPEED - JUMP BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED BR 70$ ;JUMP TO SET NEW SPEED 60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEED .IF DF R$$EIS ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EIS CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS 70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED BR 100$ ;GO AND LOAD INTO LPR .ENDC ;T$$SMC!D$$M11 .IF DF D$$M11&R$$CON YMLPAR::RETURN .ENDC .ENDC ;T$$GMC!T$$SMC!D$$M11 ; ;+ ; YHPWUP - POWER-UP. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0 ; US.DSB 0 ;- ; ; .IF DF R$$CON YHCONL:: .IF DF M$$EXT MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5 MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPL MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL .ENDC ;M$$EXT YHCPUP:: .IFF YHPWUP::TST R2 ;IS THIS LINE ZERO? BNE 80$ ;N - JUMP .IFTF MOV #4000,@R3 ;CLEAR SILO, UARTS, CONTROLLER MOV #20100,@R3 ;ENABLE INTERRUPTS .IFT RETURN YHUONL:: YHUPUP:: .ENDC ;R$$CON 80$: ;REFERENCE LABEL .IF DF D$$M11 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE? BEQ 100$ ;N - JUMP BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF NDF R$$MPL MOV U.SCB-U.TSTA(R5),R0 ;GET SCB TST S.DMCS(R0) ;IS THERE REMOTE SUPPORT FOR LINE? BNE 90$ ;Y - JUMP BIC #U2.RMT,U.CW2-U.TSTA(R5) ;N - SET LINE LOCAL BR 100$ ;FORGET THAT IT WAS EVER REMOTE 90$: ;REFERENCE LABEL .IFTF ;NDF R$$MPL BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG .IFT ;NDF R$$MPL MOV R3,-(SP) ;SAVE DH11 CSR CALL YHMTIM ;ENABLE INTERRUPTS ON DM11-BB MOV (SP)+,R3 ;RESTORE DH11 CSR .ENDC ;NDF R$$MPL .IF DF R$$CON MOV U.SCB-U.TSTA(R5),R0 ;GET SCB MOV S.KRB(R0),R0 ;GET DH11 KRB MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX ADD YMCP1,R0 ;POINT TO POINTER TO DM11-BB KRB MOV @R0,R0 ;GET DM11-BB KRB MOVB U.UNIT-U.TSTA(R5),R1 ;GET UNIT NUMBER OF THIS LINE ASL R1 ;CONVERT FROM BYTE OFFSET TO WORD OFFSET BIS $BTMSK(R1),K.PRM-2(R0) ;SET ENABLE BIT FOR THIS LINE BIT #KS.OFL,K.STS(R0) ;IS DM CONTROLLER OFFLINE? BNE 100$ ;Y - JUMP MOV R3,-(SP) ;SAVE YH CSR MOV @R0,R3 ;GET YM CSR CALL YHMTMA ;LET DM KNOW ABOUT THIS LINE NOW MOV (SP)+,R3 ;RESTORE YH CSR .ENDC ;R$$CON .ENDC 100$: CALL LOCKI ;LOCK OUT INTERRUPTS SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS SETLIN: CALL SELLIN ;;;SELECT THE LINE SWAB R2 ;;;PUT IN HIGH ORDER BYTE ROR R2 ;;;SHIFT TO PROPER POSITION ROR R2 ;;; BIC #140017,R2 ;;;CLEAR EXTRANEOUS NONSENSE BIT #30000,R2 ;;;TRANSMIT SPEED 110 BAUD OR LOWER? BNE 110$ ;;;N - JUMP BIS #4,R2 ;;;Y - SET TWO STOP BITS 110$: BIS #3,R2 ;;;SET FOR EIGHT BIT CHARACTERS BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS BEQ 115$ ;;;NO LEAVE IT 8-BIT BIC #1,R2 ;;;SET 7-BIT 115$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; ; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED ; RETURN ;RETURN .DSABL LSB .IF DF R$$CON YHCOFF:: CALL LOCKI ;LOCK OUT INTERRUPTS MOV #4000,@R3 ;;;CLEAR SILO, UARTS, CONTROLLER RETURN YHUOFF:: CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE CLR LPR(R3) ;;;SET TO 0 BAUD TO DISABLE LINE RETURN ;;;DROP PRIORITY .ENDC ;R$$CON ; ; ;+ ; INPUT INTERRUPT SERVICE ROUTINE. ;- ; ; .ENABL LSB ; .IF DF R$$MPL $YHINP::TTSET$ YH ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL $DHINP::TTSET$ DH ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSING ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK ; ; ;+ ; OUTPUT INTERRUPT SERVICE ROUTINE. ;- ; ; .IF DF R$$MPL $YHOUT::TTSET$ YH ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL $DHOUT::TTSET$ DH ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL 10$: BIC #100077,@R3 ;;;CLEAR TRANSMIT DONE, UNIT NUMBER AND ;;;2 HIGH BITS OF UNIBUS ADDRESS MOV R4,-(SP) ;;;SAVE KRB ADDRESS .IF DF R$$MPL ADD K.OFF(R4),R4 ;;;GET START OF UCB TABLE .ENDC ;R$$MPL 20$: MOV (R4)+,R5 ;;;GET NEXT UCB ADDRESS BEQ 80$ ;;;JUMP IF LINE IS NOT IN USE CMP R5,#-1 ;;;END OF LIST? BEQ 90$ ;;;Y - JUMP .IF DF R$$CON BITB #US.OFL,U.ST2(R5) ;;;OFFLINE? BNE 80$ ;;;Y - JUMP .ENDC ;R$$CON MOV R4,-(SP) ;;;SAVE R4 MOV R3,-(SP) ;;;SAVE CSR .IF DF T$$SPL MOV U.TAPR(R5),@#KDSAR5 ;;;MAP UCBX MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFF ;T$$SPL ASSUME U.TSTA, ADD #U.TUX,R5 ;;;POINT TO UCBX POINTER MOV (R5)+,R4 ;;;GET UCBX .ENDC ;T$$SPL BIT #2000,@R3 ;;;NXM BIT SET? BEQ 30$ ;;;N - JUMP BIS #400,@R3 ;;;Y - CLEAR IT MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND BR 60$ ;;;GO ON TO NEXT LINE 30$: TST BCR(R3) ;;;HAS THIS LINE COMPLETED TRANSMISSION? BNE 60$ ;;;N - JUMP BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PENDING? BEQ 35$ ;;;N - JUMP MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER ASL R2 ;;; .. TIMES 2 CALL STAXH ;;;START HIGH PRIORITY OUTPUT BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED 35$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED? BNE 45$ ;;;Y - JUMP BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING NORMAL PRIORITY OUTPUT? BEQ 37$ ;;;N - COMPLETE INTERRUPTED OUTPUT STREAM BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;START NORMAL (NOT HIGH) PRIORITY REQUEST MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER ASL R2 ;;; .. TIMES 2 CALL STAXN ;;;BEGIN OUTPUT DELAYED BY HIGH PRIORITY REQUEST BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED 37$: .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 40$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC DEC @R4 ;;;ANYTHING LEFT TO OUTPUT? BEQ 50$ ;;;N - JUMP MOVB U.UNIT-U.TSTA(R5),R2 ;;; get the line index ASL R2 ;;; and create a word index for STAX CALL STAXM ;;;Y - INITIATE ANOTHER TRANSFER BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED .ENDC ;T$$ACD 40$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE BEQ 50$ ;;;N - JUMP ; ; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT. ; TST -(R4) ;;;POINT TO U.TOP+2 MOV (SP)+,R3 ;;;GET CSR MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER ASL R2 ;;; .. TIMES 2 CALL STAX1 ;;;START OUTPUT BR 70$ ;;; 45$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO HIGH PRIORITY OUTPUT IN PROGRESS BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED ; 50$: CALL ODONE ;;;DO OUTPUT DONE PROCESSING 60$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER 70$: MOV (SP)+,R4 ;;;RESTORE R4 80$: BICB #60,@R3 ;;;CLEAR 2 HIGH BITS OF UNIBUS ADDRESS ;;;TO AVOID OVERFLOW INTO BIT 6 WHEN ;;;INCREMENTING LINE NUMBER INCB @R3 ;;;INCREMENT LINE NUMBER BR 20$ ;;;GO TRY NEXT LINE ; ; ALL LINES SCANNED. SEE IF ANY LINE COMPLETED TRANSMIT ; "BEHIND" US IN THE SCAN LOOP. ; 90$: MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS ;;; OR ADDRESS OF UCB LIST (RSX-11M) TST @R3 ;;;XMIT RDY SET? BMI 10$ ;;;Y - DO IT ALL OVER AGAIN ; ; ALL OUTPUT WORK DONE. SEE IF ANY INPUT WORK NEEDED. ; MOV NRC(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 100$ ;;;NONE - EXIT CALL MUXIN1 ;;;PROCESS AS INPUT INTERRUPT BR 10$ ;;;OUTPUT WORK TO DO - JUMP ;;;MUXIN1 DISMISSES INTERRUPT IF NO OUTPUT WORK ; ; ; ; .IF NDF R$$EIS ; ; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS ; SHIFT4: ASL R2 ;SHIFT ONCE ASL R2 ;TWICE ASL R2 ;THRICE ASL R2 ;LAST TIME RETURN .ENDC ;NDF R$$EIS ; ; SUBROUTINE TO SELECT LINE ON DH11. ; ; SELLIN: BICB #77,@R3 ;;;CLEAR LINE NUMBER AND 2 HIGH BITS ;;;OF 18-BIT ADDRESS BISB U.UNIT-U.TSTA(R5),@R3 ;;;SELECT LINE 100$: RETURN ;;; ; .DSABL LSB .IF DF D$$M11 .IF DF R$$CON YMCONL:: YMCPUP:: CALL LOCKI ;RAISE OUR PRIORITY BIC #1040,@R3 ;;;STOP DM11-BB SCAN 10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAIT CLR R0 ;;;INITIALLY SET TO LINE 0 20$: MOV R0,@R3 ;;;SELECT LINE ASL R0 ;;;CONVERT TO WORD OFFSET BIT $BTMSK(R0),K.PRM-2(R2) ;;;SHOULD WE ENABLE THIS LINE? BEQ 30$ ;;;N - JUMP BIS #7,2(R3) ;;;Y - ASSERT DTR, RTS AND LINE ENABLE 30$: ASR R0 ;;;RESTORE COUNT INC R0 ;;;INCREMENT TO NEXT LINE CMP R0,#15 ;;;GONE THRU EVERY LINE? BLE 20$ ;;;N - LOOP BIS #140,@R3 ;;;ENABLE SCAN AND INTERRUPTS RETURN ;;;RETURN WILL LOWER PRIORITY YMCOFF:: CALL LOCKI ;LOCK OUT INTERRUPTS BIC #1140,@R3 ;;;DISABLE SCAN AND INTERRUPTS YMSTAX:: YMABOX:: YMRESX:: YMSTOX:: YMMTIM:: YMUPUP:: YMUONL:: YMUOFF:: RETURN ;;; .ENDC ;R$$CON ;+ ; DM11-BB DATASET STATUS CHANGE INTERRUPT ;- ; ; .IF DF R$$MPL $DM11B::TTSET$ YM ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL $DM11B::TTSET$ DM ;;;SAVE R2,R3 AND SET UP ;;; R3 = DH11 CSR ;;; R4 = ADDRESS OF DH UCB LIST MOV -4(R4),R3 ;;;GET DM11-BB CSR .ENDC ;R$$MPL BIC #240,@R3 ;;;CLEAR DONE FLAG AND DISABLE SCAN MOV (R3)+,R5 ;;;GET LINE NUMBER IN BITS 0-3 CALL MUXUCB ;;;GET POINTER TO U.TSTA BCS 10$ ;;;UNKNOWN LINE - JUMP MOV @R3,R4 ;;;GET MODEM STATUS CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSING BVC 10$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 5$ ;;;DROP DTR - JUMP BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE BIS #40,-(R3) ;;;REENABLE SCAN RETURN 5$: BIC #6,@R3 ;;;DEASSERT DTR AND RTS 10$: BIS #40,-(R3) ;;;REENABLE SCAN BCS 30$ ;;;NO CALL ANSWERED - JUMP MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCB .IF DF R$$MPL MOV @S.KRB(R3),R3 ;;;GET DH CSR ADDRESS .IFF ;R$$MPL MOV S.CSR(R3),R3 ;;;GET DH CSR ADDRESS .ENDC ;R$$MPL MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEED BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELD MOVB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW RECEIVE SPEED IN DATABASE .IF DF R$$EIS ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EIS CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS BISB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW TRANSMIT SPEED IN DATABASE MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS ASSUME S4.ABD,100000 TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED? BPL 20$ ;;;IF NOT, DON'T SET BAUD MOV #314,R2 ;;;Y - SET LINE TO 4800 BAUD 20$: JMP SETLIN ;;;SET LINE PARAMETERS ; 30$: RETURN ;;;DISMISS INTERRUPT ; ; ;+ ; YHMTIM - MODEM TIME-OUT ;- ; ; .IF DF R$$MPL YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB MOV S.KRB(R3),R3 ;GET DH11 KRB MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX ADD YMCP1,R3 ;POINT TO POINTER TO DM11-BB KRB MOV @(R3)+,R3 ;GET DM11-BB CSR .IFF ;R$$MPL YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB MOV S.DMCS(R3),R3 ;GET DM11-BB CSR .ENDC ;R$$MPL YHMTMA: CALL LOCKI ;DISABLE INTERRUPTS BIC #1040,@R3 ;;;STOP SCAN 10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAIT BIC #17,@R3 ;;;CLEAR LINE NUMBER ; ; NOTE - CANNOT USE BYTE INSTRUCTIONS ON DM11-BB ; MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBER BIS R4,(R3)+ ;;;SELECT LINE CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTS BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE BR 30$ ;;;ENABLE SCAN 20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMIT INC @R3 ;;;SET LINE ENABLE 30$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTS RETURN ;;;RETURN FROM COROUTINE .ENDC ;D$$M11 .ENDC ;D$$H11 .END